package com.chaike.hsq.bean.response.pay;

import com.chaike.hsq.bean.request.pay.AppletsPayRequest;
import com.chaike.hsq.bean.response.BizBaseResponse;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 慧收钱 支付结果查询 业务参数解析结果.
 * 文档地址：https://docs.huishouqian.com/HSQ_copy/HSQ-AppletPayAPI-TransQueryAPI-1_copy.html
 *
 * @author Luo
 * @version 1.0
 * @date 2021-10-14 10:36
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PayQueryResponse extends BizBaseResponse implements Serializable {

    private static final long serialVersionUID = 5190642453439420460L;

    /**
     * <pre>
     * 字段名：商户订单号.
     * 变量名：transNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    原支付交易对应的商户订单号
     * </pre>
     */
    private String transNo;

    /**
     * <pre>
     * 字段名：交易订单号.
     * 变量名：tradeNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    慧收钱系统交易订单号
     * </pre>
     */
    private String tradeNo;

    /**
     * <pre>
     * 字段名：交易金额.
     * 变量名：orderAmt
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *    交易金额，单位：分
     * </pre>
     */
    private String orderAmt;

    /**
     * <pre>
     * 字段名：交易状态.
     * 变量名：orderStatus
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *    详见交易状态码
     * </pre>
     *
     * @see com.chaike.hsq.consts.HsqPayEnum.OrderStatus
     */
    private String orderStatus;

    /**
     * <pre>
     * 字段名：完成时间.
     * 变量名：finishedDate
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *    交易完成时间，格式[yyyyMMddHHmmss]
     * 示例：20190101140908
     * </pre>
     */
    private String finishedDate;

    /**
     * <pre>
     * 字段名：交易类型.
     * 变量名：payType
     * 是否必填：是
     * 类型：string[1,32]
     * 描述：
     *    ALI_APPLET：支付宝
     *    WECHAT_APPLET：微信
     * </pre>
     *
     * @see com.chaike.hsq.consts.HsqPayEnum.Type
     */
    private String payType;

    /**
     * <pre>
     * 字段名：商品信息.
     * 变量名：goodsInfo
     * 是否必填：是
     * 类型：string[1,128]
     * 描述：
     *    商品说明
     * </pre>
     */
    private String goodsInfo;

    /**
     * <pre>
     * 字段名：交易时间.
     * 变量名：requestDate
     * 是否必填：是
     * 类型：string[1,14]
     * 描述：
     *    交易请求时间，格式[yyyyMMddHHmmss]
     * 示例值：20190101140908
     * </pre>
     */
    private String requestDate;

    /**
     * <pre>
     * 字段名：用户账号.
     * 变量名：buyerName
     * 是否必填：否
     * 类型：string[1,64]
     * 描述：
     *    支付宝返回支付宝用户账号（脱敏），微信返回用户支付标识（openid）
     * </pre>
     */
    private String buyerName;

    /**
     * <pre>
     * 字段名：慧收钱上送三方支付的交易订单号.
     * 变量名：channelOrderNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    慧收钱上送三方支付的交易订单号
     * </pre>
     */
    private String channelOrderNo;

    /**
     * <pre>
     * 字段名：渠道交易单号.
     * 变量名：payOrderNo
     * 是否必填：否
     * 类型：string[1,64]
     * 描述：
     *    支付宝/微信/银联返回的交易号
     * </pre>
     */
    private String payOrderNo;

    /**
     * <pre>
     * 字段名：渠道支付方式.
     * 变量名：fundChannel
     * 是否必填：否
     * 类型：string[1,32]
     * 描述：
     *    支付宝/微信/银联返回的支付方式，详见
     *    支付宝：
     *    微信：
     * </pre>
     */
    private String fundChannel;

    /**
     * <pre>
     * 字段名：渠道支付编码.
     * 变量名：fundBankCode
     * 是否必填：否
     * 类型：string[1,32]
     * 描述：
     *    支付宝/微信/银联返回的银行编码/借贷标识，详见
     *    支付宝：
     *    微信：
     * </pre>
     */
    private String fundBankCode;

    /**
     * <pre>
     * 字段名：附加字段.
     * 变量名：extend
     * 是否必填：否
     * 类型：string[1,128]
     * 描述：
     *    附加数据，原样返回
     * </pre>
     */
    private String extend;

    /**
     * <pre>
     * 字段名：扩展信息域.
     * 变量名：memo
     * 是否必填：否
     * 类型：string[1,512]
     * 描述：
     *    Json格式，将如下参数转Json
     * </pre>
     */
    private AppletsPayRequest.Memo memo;

    /**
     * 扩展信息域.
     */
    @Data
    @Accessors(chain = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class Memo implements Serializable {

        private static final long serialVersionUID = 9174668613903300598L;

        /**
         * <pre>
         * 字段名：限制卡类型.
         * 变量名：paylimit
         * 是否必填：否
         * 类型：string[1,128]
         * 描述：
         *    限制不能使用的支付类型
         *    微信：no_credit--指定不能使用信用卡支付
         *    支付宝：https://opendocs.alipay.com/open/common/wifww7
         * </pre>
         */
        @JsonAlias("paylimit")
        private String payLimit;

        /**
         * <pre>
         * 字段名：交易结束时间.
         * 变量名：timeExpire
         * 是否必填：否
         * 类型：string[1,14]
         * 描述：
         *    订单失效时间，格式[yyyyMMddHHmmss]
         * 建议：最短失效时间间隔大于1分钟
         * 示例值：20190101140908
         * </pre>
         */
        private String timeExpire;

        /**
         * <pre>
         * 字段名：用户标识.
         * 变量名：openid
         * 是否必填：是
         * 类型：string[1,64]
         * 描述：
         *    用户在商户appid下的唯一标识。下单前需获取到用户的Openid
         * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
         * </pre>
         */
        private String openid;

        /**
         * <pre>
         * 字段名：应用ID.
         * 变量名：appid
         * 是否必填：否
         * 类型：string[1,64]
         * 描述：
         *    微信公众号APPID
         * 示例值：wxd678efh567hg6787
         * </pre>
         */
        private String appid;

        /**
         * <pre>
         * 字段名：终端用户IP.
         * 变量名：spbillCreateIp
         * 是否必填：是
         * 类型：string[1,32]
         * 描述：
         *    消费者端IP，支持ipv4、ipv6格式
         * 示例值：123.12.12.123
         * </pre>
         */
        private String spbillCreateIp;

        /**
         * <pre>
         * 字段名：经度.
         * 变量名：longitude
         * 是否必填：是
         * 类型：string[1,32]
         * 描述：
         *    交易所在地经度 用于交易地点定位
         * </pre>
         */
        private String longitude;

        /**
         * <pre>
         * 字段名：纬度.
         * 变量名：latitude
         * 是否必填：是
         * 类型：string[1,32]
         * 描述：
         *    交易所在地经度 用于交易地点定位
         * </pre>
         */
        private String latitude;

        /**
         * <pre>
         * 字段名：区域信息.
         * 变量名：areaInfo
         * 是否必填：否
         * 类型：string[1,7]
         * 描述：
         *    银联选填 区域信息 长度固定7
         * </pre>
         */
        private String areaInfo;

        /**
         * <pre>
         * 字段名：应用程序版本.
         * 变量名：appVersion
         * 是否必填：否
         * 类型：string[1,8]
         * 描述：
         *    银联选填 固定8位，长度不足右补空格
         * </pre>
         */
        private String appVersion;

        /**
         * <pre>
         * 字段名：设备类型.
         * 变量名：deviceType
         * 是否必填：否
         * 类型：string[1,8]
         * 描述：
         *    银联选填 终端设备类型，取值如下:
         *       01：自动柜员机（含 ATM 和 CDM）和多媒体自助终端
         *       02：传统 POS
         *       03：mPOS
         *       04：智能 POS
         *       05：II型固定电话
         * </pre>
         */
        private String deviceType;

        /**
         * <pre>
         * 字段名：终端设备号.
         * 变量名：deviceNo
         * 是否必填：否
         * 类型：string[1,50]
         * 描述：
         *    银联选填 最多50位，终端设备的硬件序列号
         * </pre>
         */
        private String deviceNo;

    }

}
